作者:年轻的周末我做主 | 来源:互联网 | 2023-02-07 19:57
本文已收录github:https://github.com/BigDataScholar/TheKingOfBigData,里面有大数据高频考点,Java一线大厂面试题资源,上百本免费电子书籍,作者亲绘大数据生态圈思维导图…持续更新,欢迎star!
前言
上一篇文章已经为大家介绍了 Hive 在用户画像的标签数据存储中的具体应用场景,本篇我们来谈谈MySQL的使用!
原著作者:赵宏田
来源:《用户画像方法论与工程化解决方案》
MySQL作为关系型数据库,在用户画像中可用于元数据管理、监控预警数据、结果集存储等应用中。下面详细介绍这3个应用场景。
元数据管理
Hive适合于大数据量的批处理作业,对于量级较小的数据,MySQL具有更快的读写速度。Web端产品读写MySQL数据库会有更快的速度,方便标签的定义、管理。
在介绍用户画像产品化的时候,我们会介绍元数据录入和查询功能,将相应的数据存储在MySQL中。用户标签的元数据表结构设计也会在之后进行详细的介绍。这里给出了平台标签视图和元数据管理页面。
平台标签视图中的标签元数据可以维护在MySQL关系数据库中,便于标签的编辑、查询和管理。
监控预警数据
MySQL还可用于存储每天对ETL结果的监控信息。从整个画像调度流的关键节点来看,需要监控的环节主要包括对每天标签的产出量、服务层数据同步情况的监控等主要场景。下图展示的是用户画像调度流主要模块。
1.标签计算数据监控
主要用于监控每天标签ETL的数据量是否出现异常,如果有异常情况则发出告警邮件,同时暂停后面的ETL任务。
2. 服务层同步数据监控
服务层一般采用HBase
、Elasticsearch
等作为数据库存储标签数据供线上调用,将标签相关数据从Hive数仓向服务层同步的过程中,有出现差错的可能,因此需要记录相关数据在Hive中的数量及同步到对应服务层后的数量,如果数量不一致则触发告警。
在对画像的数据监控中,调度流每跑完相应的模块,就将该模块的监控数据插入MySQL中,当校验任务判断达到触发告警阈值时,发送告警邮件,同时中断后续的调度任务。待开发人员解决问题后,可重启后续调度。
3. 结果集存储
结果集可以用来存储多维透视分析用的标签、圈人服务用的用户标签、当日记录各标签数量,用于校验标签数据是否出现异常。
有的线上业务系统使用MySQL、Oracle等关系型数据库存储数据,如短信系统、消息推送系统等。在打通画像数据与线上业务系统时,需要考虑将存储在Hive中的用户标签相关数据同步到各业务系统,此时MySQL可用于存储结果集。
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互迁移的工具。它可以将一个关系型数据库(如MySQL、Oracle、PostgreSQL等)中的数据导入Hadoop的HDFS中,也可以将HDFS中的数据导入关系型数据库中
下面通过一个案例来讲解如何使用Sqoop将Hive中的标签数据迁移到MySQL中。
电商、保险、金融等公司的客服部门的日常工作内容之一是对目标用户群(如已流失用户、高价值用户等)进行主动外呼,以此召回用户来平台进行购买或复购。这里可以借助用户画像系统实现该功能。
将Hive中存储的与用户身份相关的数据同步到客服系统中,首先在Hive中建立一张记录用户身份相关信息的表(例如dw.userprofile_userservice_all
)。设置日期分区以满足按日期选取当前人群的需要。
CREATE TABLE `dw.userprofile_userservice_all `(
`user_id` string COMMENT 'userid',
`user_sex` string COMMENT 'user_sex',
`city` string COMMENT 'city',
`payid_money` string COMMENT 'payid_money',
`payid_num` string COMMENT 'payid_num',
`latest_product` string COMMENT 'latest_product',
`date` string COMMENT 'date',
`data_status` string COMMENT 'data_status')
COMMENT 'userid 用户客服数据'
PARTITIONED BY ( `data_date` string COMMENT '数据日期')
在MySQL中建立一张用于接收同步数据的表(userservice_data
)。
CREATE TABLE `userservice_data` (`user_id` varchar(128) DEFAULT NULL COMMENT '用户id',`user_sex` varchar(128) NOT NULL COMMENT '用户性别',`city` varchar(128) DEFAULT NULL COMMENT '城市',`payid_money` varchar(128) DEFAULT NULL COMMENT '消费金额',`payid_num` varchar(128) DEFAULT NULL COMMENT '消费次数',`latest_product` varchar(128) DEFAULT NULL COMMENT '最近购买产品',`date` varchar(64) NOT NULL COMMENT '传输日期',`data_status` varchar(64) DEFAULT '0' COMMENT '0:未传输,1:传输中,2:成功,3:失败',PRIMARY KEY (`user_id`),
) ENGINE=InnoDB AUTO_INCREMENT=2261628 DEFAULT CHARSET=utf8 COMMENT='用户客服数据表';
通过Python脚本调用shell命令,将Hive中的数据同步到MySQL中。执行如下脚本:
import os
import MySQLdb
import sys
def export_data(hive_tab, data_date):sqoop_command = "sqoop export --connect jdbc:mysql://10.xxx.xxx.xxx:3306/mysql_database --username username --password password --table mysql_table --export-dir hdfs://nameservice1/user/hive/warehouse
/dw.db/" + hive_tab + "/data_date=" + data_date + " --input-fields-terminated-by '\001'"os.system(sqoop_command)print(sqoop_command)if __name__ == '__main__':export_data("dw.userprofile_userservice_all", '20181201')
其中用到了 sqoop 从 Hive 导出数据到 MySQL 的命令:
sqoop export
不熟悉Sqoop使用的小伙伴可以去看我的这篇文章《硬核 | Sqoop入门指南》
同步后 MySQL中的数据如图所示
小结
本篇文章主要介绍了在用户画像的业务场景下,MySQL存储相关数据的真实应用场景!后续会陆续为大家介绍 HBase和Elasticsearch,敬请期待!